/**
 * 
 */
package uni.edu.pe.analisisSentimental.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

import static uni.edu.pe.analisisSentimental.common.Constantes.*;
import uni.edu.pe.analisisSentimental.dao.GeneralDAO;
import uni.edu.pe.analisisSentimental.domain.JergaInternet;
import uni.edu.pe.analisisSentimental.domain.PistaSubjetividad;
import uni.edu.pe.analisisSentimental.dto.OpinionMensajeDto;

/**
 * @author nestor
 *
 */
@Repository
public class GeneralDAOImpl implements GeneralDAO {

    private static Logger logger = LoggerFactory.getLogger(GeneralDAOImpl.class);
    
	// SimpleJdbcTemplate-style...
	private SimpleJdbcTemplate simpleJdbcTemplate;

	@Autowired
	public void setDataSource(DataSource dataSource) {
	    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.GeneralDAO#obtenerJergasInternet()
	 */
	public Map<String, String> obtenerJergasInternet() {	
		logger.debug("<==== Inicio Method obtenerTweetsParaTratamientoLenguaje ====>");
		String sql = "Select Jerga, Equivalencia from JERGA_INTERNET";

		final Map<String, String> mapJi= new HashMap<String, String>();
		RowMapper<JergaInternet> mapper = new RowMapper<JergaInternet>() {  
		        public JergaInternet mapRow(ResultSet rs, int rowNum) throws SQLException {		        	 
		        	 JergaInternet tpdto = null;
		        	 String jerga = rs.getString("Jerga");;
		        	 String equivalencia = rs.getString("Equivalencia");
		             mapJi.put(jerga, equivalencia);
		            return tpdto;
		        }
		    };
		
	    this.simpleJdbcTemplate.query(sql, mapper);
	     
	    return  mapJi;
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.GeneralDAO#obtenerPistasSubjetividad()
	 */
	public Map<String, PistaSubjetividad> obtenerPistasSubjetividad() {	
		logger.debug("<==== Inicio Method obtenerPistasSubjetividad ====>");
		
		String sql = "Select palabra, categoria_lexica, tipo, polaridad, ind_stem from PISTAS_SUBJETIVIDAD";

		final Map<String, PistaSubjetividad> mapPista = new HashMap<String, PistaSubjetividad>();
		RowMapper<PistaSubjetividad> mapper = new RowMapper<PistaSubjetividad>() {
			public PistaSubjetividad mapRow(ResultSet rs, int rowNum)
					throws SQLException {
				PistaSubjetividad ps = new PistaSubjetividad();
				ps.setPalabra(rs.getString("palabra"));
				ps.setCategoriaLexica(rs.getString("categoria_lexica"));
				ps.setTipoSubjetividad(rs.getString("tipo"));
				ps.setPolaridad(rs.getString("polaridad"));
				ps.setIndStem(rs.getString("ind_stem"));
				
				mapPista.put(ps.getPalabra(), ps);
				return ps;
			}
		};

	    this.simpleJdbcTemplate.query(sql, mapper);
	     
	    return  mapPista;
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.GeneralDAO#obtenerPistasFuertementeSubjetivas()
	 */
	public List<PistaSubjetividad> obtenerPistasFuertementeSubjetivas() {	
		logger.debug("<==== Inicio Method obtenerPistasFuertementeSubjetivas ====>");
		
		String sql = "Select palabra, categoria_lexica, tipo, polaridad, ind_stem from PISTAS_SUBJETIVIDAD "+
					 " where tipo = :tipo and polaridad <> :polaridad";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("tipo", SUBJETIVIDAD_FUERTE);
		parameters.put("polaridad", COD_OPINION_OBJETIVA);

		RowMapper<PistaSubjetividad> mapper = new RowMapper<PistaSubjetividad>() {
			public PistaSubjetividad mapRow(ResultSet rs, int rowNum)
					throws SQLException {
				PistaSubjetividad ps = new PistaSubjetividad();
				ps.setPalabra(rs.getString("palabra"));
				ps.setCategoriaLexica(rs.getString("categoria_lexica"));
				ps.setTipoSubjetividad(rs.getString("tipo"));
				ps.setPolaridad(rs.getString("polaridad"));
				ps.setIndStem(rs.getString("ind_stem"));
				return ps;
			}
		};

	    return this.simpleJdbcTemplate.query(sql, mapper, parameters);
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.GeneralDAO#obtenerOpinionMensaje(java.lang.String)
	 */
	public List<OpinionMensajeDto> obtenerOpinionMensaje(String codFinalidadData) {	
		logger.debug("<==== Inicio Method obtenerOpinionMensaje ====>");
		
		String sql = "SELECT tp.idTweet, tp.CodOpinionWeb, " +
				"tp.CodOpinionTwitter,  url.Id, " +
				"st.CodOpinionInicial OpiIniTweet, urlp.CodOpinionInicial OpiIniWeb " +
				"FROM tweets_procesados " +
				"tp INNER JOIN status_tweet st ON tp.IdTweet=st.IdTweet " +
				"LEFT JOIN URL url ON st.idtweet = url.idtweet " +
				"LEFT JOIN URL_PROCESADAS urlp ON url.Id = urlp.Id  " +
				"where st.CodFinalidadData=:codFinalidadData " +
				"and tp.CodFaseTwitter in (:codFaseTwitterSubj,:codFaseTwitterSent)  and tp.FlagHabilitado=:flagHabilitado " +
				"and (tp.CodFaseWeb = :codFaseWebNoIniciado or (tp.CodFaseWeb=:codFaseWebFinalizado " +
				"and urlp.FlagHabilitado=:flagHabilitado))";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("codFinalidadData", codFinalidadData);
		parameters.put("codFaseTwitterSubj", COD_FASE_ANALISIS_SUBJETIVIDAD_RM_1);
		parameters.put("codFaseTwitterSent", COD_FASE_ANALISIS_SENTIMIENTO);
		parameters.put("flagHabilitado", FLAG_HABILITADO);
		parameters.put("codFaseWebNoIniciado", COD_FASE_PROCESO_NO_INICIADO_WEB);
		parameters.put("codFaseWebFinalizado", COD_FASE_ANALISIS_SENTIMIENTO_RM_WEB);

		RowMapper<OpinionMensajeDto> mapper = new RowMapper<OpinionMensajeDto>() {
			public OpinionMensajeDto mapRow(ResultSet rs, int rowNum)
					throws SQLException {
				OpinionMensajeDto om = new OpinionMensajeDto();
				om.setCodOpinionTwitter(rs.getString("codOpinionTwitter"));
				om.setCodOpinionWeb(rs.getString("codOpinionWeb"));
				om.setIdTweet(rs.getLong("idTweet"));
				om.setOpiIniTweet(rs.getString("opiIniTweet"));
				om.setOpiIniWeb(rs.getString("opiIniWeb"));
				return om;
			}
		};

	    return this.simpleJdbcTemplate.query(sql, mapper, parameters);
	}
	

}
